package DAO;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import main.Publicador;

import Beans.Arquivo;
import Beans.Turma;

public class ArquivoDAOImplementation implements ArquivoDAO{

	@Override
	public Arquivo [] buscarInfArquivos(String ra) {
		// TODO Auto-generated method stub
		Arquivo [] arquivos = null;
		Connection con = ResourceManager.getConnection();
		String sql = "SELECT nome, tamanho, dataUltimaModificacao FROM Arquivo WHERE raAluno=?;";
		String sqlQuantidade = "SELECT COUNT(*) FROM Arquivo WHERE raAluno=?;";
		
		PreparedStatement ps;
		try {
			ps = con.prepareStatement(sqlQuantidade);		
			ps.setString(1, ra);
			ResultSet rs = ps.executeQuery();

			rs.next();
			arquivos = new Arquivo[rs.getInt("COUNT(*)")];
			
			ps = con.prepareStatement(sql);		
			ps.setString(1, ra);
			rs = ps.executeQuery();
			
			for(int i=0; rs.next(); i++){
				Arquivo arquivo = new Arquivo();
				arquivo.setNome(rs.getString("nome"));
				arquivo.setTamanho(rs.getLong("tamanho"));
				arquivo.setDataUltimaModificacao(rs.getDate("dataUltimaModificacao"));
				
				arquivos[i] = arquivo;
				
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		ResourceManager.close(con);
		return arquivos;
	}

	@Override
	public boolean upload(InputStream input, String raAluno, String nomeArquivo, Turma turma){	
		boolean retorno = false;
		try {
			String localArquivo = Publicador.getLocal() + turma.getAno() + "-" + turma.getSemestre() + "/" + turma.getNomeCurso() + "/" +raAluno + "/" + raAluno + "_" + nomeArquivo;
			File file = new File(localArquivo);
			OutputStream out = new FileOutputStream(file);
			int read = 0;
			byte[] bytes = new byte[1024];
			
			while((read = input.read(bytes)) != -1)
				out.write(bytes, 0, read);
			out.close();		
			input.close();
			
			Connection con = ResourceManager.getConnection();
			String sql = "INSERT INTO Arquivo(nome, raAluno, tamanho, dataUltimaModificacao) VALUES (?, ?, ?, ?)";
			try {
				PreparedStatement ps = con.prepareStatement(sql);
				ps.setString(1, nomeArquivo);
				ps.setString(2, raAluno);
				ps.setLong(3, file.length());
				java.sql.Date data = new java.sql.Date(new java.util.Date().getTime());
				ps.setDate(4, data);
				
				int rs = ps.executeUpdate();
				if(rs == 1)
					retorno = true;
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}		
			
			ResourceManager.close(con);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
		
		return retorno;
	}

	@Override
	public File download(String ra, String nomeArquivo, Turma turma) {
		// TODO Auto-generated method stub
		File file = new File(Publicador.getLocal() + "/" + turma.getAno() + "-" + turma.getSemestre() + "/" + turma.getNomeCurso() + "/" + ra + "/" + ra + "_" + nomeArquivo);
		return file;
	}

}
